#include "argtable3/argtable3.h"
#include "esp_console.h"
#include "esp_log.h"
#include "esp_system.h"
#include "cmd_system.h"
#include "cmd_wifi.h"


#define PROMPT_STR "LY@"



void register_my_command(void);
void INIT_CMD()
{
    esp_console_repl_t*       repl        = NULL;
    esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT();
    /* Prompt to be printed before each line.
     * This can be customized, made dynamic, etc.
     */
    repl_config.prompt             = PROMPT_STR ">";
    repl_config.max_cmdline_length = 256;

    /* Register commands */
    esp_console_register_help_command();
   
    register_system_common();

    register_my_command();
    register_wifi();

    esp_console_dev_uart_config_t hw_config = ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_console_new_repl_uart(&hw_config, &repl_config, &repl));

    ESP_ERROR_CHECK(esp_console_start_repl(repl));

}

//对自定义命令进行参数解析
static int my_command_handler(int argc, char **argv)
{
    // 处理命令行参数
    if (argc > 1) {
        printf("Argument 1: %s\n", argv[1]);
    }
    if (argc > 2) {
        printf("Argument 2: %s\n", argv[2]);
    }
    
    return 0;
}
static void* argtable[3] = { 0 };

void register_my_command()
{
    // 定义命令的参数
    //arg_str1表示这个参数是必须的 用户必须提供
    argtable[0] = arg_str1(NULL, NULL, "<arg1>", "First argument");
    //arg_str0表示这个参数是可选参数 用户可以不提供
    argtable[1] = arg_str0(NULL, NULL, "<arg2>", "Second argument");
    //使用srg_end表示参数表结束  里面的2表示前面的参数的个数
    argtable[2] = arg_end(2);

    // 组合参数和结束符  按照实际输入顺序


    // ESP-IDF注册命令
    esp_console_cmd_t cmd = {
        .command = "my_command",//命令名称(到时候输入的命令)
        .help = "This is a command with arguments",//命令提示(输入一半会提示)
        .hint = NULL,//命令提示颜色
        .func = &my_command_handler,//回调函数
        .argtable = argtable//参数表
    };

    ESP_ERROR_CHECK(esp_console_cmd_register(&cmd));//注册命令
}
